【C语言】const修饰指针的不同作用

您所在的位置:网站首页 const int *p不能修改 【C语言】const修饰指针的不同作用

【C语言】const修饰指针的不同作用

2024-05-08 02:24| 来源: 网络整理| 查看: 265

const修饰变量

变量是可以修改的,如果把变量的地址交给⼀个指针变量,通过指针变量的也可以修改这个变量。 但是如果我们希望⼀个变量加上⼀些限制,不能被修改,怎么做呢?这就是const的作⽤。

代码语言:javascript复制#include int main() { int m = 0; m = 20;//m是可以修改的 const int n = 0; n = 20;//n是不能被修改的 return 0; }

定义了一个整形变量m,m可以被修改值。变量n是定义的整形变量,本质上是整形变量,被const修饰后本质不变,但是语法发生改变,导致n无法被修改,修改会违反语法规则,一旦修改就会报错。

我们知道变量的值是通过地址存储的,所以我们是否可以通过地址对n进行修改呢?

代码语言:javascript复制#include int main() { const int n = 10; int* p = NULL; p = &n; *p = 20; printf("%d", n); return 0; }

通过上面示例,我们定义一个指向整形的指针p,并指向n的地址,通过解引用操作符对n处地址的值进行修改,运行后可以发现可以成功运行,并且成功修改了n的值,结果如下

我们对变量n用const修饰目的就是为了不让n的值改变,如果p拿到n的地址就能修改n,这样就打破了const的限制,这是不合理的,所以应该让p拿到n的地址也不能修改n,那接下来怎么做呢?请看下一个章节进行讲述用const修饰指针变量来进行实现该问题。

const修饰指针变量

下面通过四个例子对比来得到关于const修饰指针变量的不同方式所得到的不同结论。

①不用const修饰代码语言:javascript复制void test1() { int n = 10; int m = 20; int *p = &n; *p = 20;//ok? p = &m; //ok? }

运行:

通过运行我们可以发现test1成功运行(最后修改p的指向,指向了m)且通过指针p完成了对n的修改。

②const放在*的左边代码语言:javascript复制void test2() { //代码2 int n = 10; int m = 20; const int* p = &n; *p = 20;//ok? p = &m; //ok? }

运行:

运行后发现无法通过运行。在const在*左边时,意思是指针p指向的n是一个用const修饰的变量,所以通过*p无法对n进行修改。但是可以改变指针p的指向的指向,无报错(如下):

③const放在*的右边代码语言:javascript复制void test3() { int n = 10; int m = 20; int *const p = &n; *p = 20; //ok? p = &m; //ok? }

运行:

同样出现了报错,但是这次的报错行数在p = &m;处,说明当const在*右边时修饰的是指针p,使指针无法改变指向的地址。上一行的*p可以运行无报错说明通过解引用操作符可以改变p指向的变量的值。

④*的左右两边都有const代码语言:javascript复制void test4() { int n = 10; int m = 20; int const * const p = &n; *p = 20; //ok? p = &m; //ok? }

运行:

运行发现两处均出现报错,现在的指针指向不能改变,指针指向的变量通过指针也不能改变。

int const * const p = &n中,*前面的const使n变成了常变量,使指针也被修饰,导致了这两处报错。

结论

• const如果放在*的左边,修饰的是指针指向的内容,保证指针指向的内容不能通过指针来改变。但是指针变量本⾝的内容可变。 • const如果放在*的右边,修饰的是指针变量本⾝,保证了指针变量的内容(指针指向)不能修改,但是指针指向的内容,可以通过指针改变



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3